
package DAO;

import Connection.ConnectionFactory;
import Interfaces.Inter_Nivel;
import Model.Nivel;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DAO_Nivel implements Inter_Nivel{
    
     Connection con;

    public DAO_Nivel() throws Exception{
        try{
            this.con =ConnectionFactory.getConnection();
        }
        catch(Exception e){
            throw new Exception("Erro ao conectar no Nivel\n"+e.getMessage());
        }
    } 
    
    public void GravaNivel(Nivel nivel) throws Exception
    {
        PreparedStatement ps =null;

        if(nivel ==null)
            throw new Exception("Nao pode gravar um Nivel nulo");

        try
        {
            String sql ="INSERT INTO NIVEL (ID_Nivel, DES_Nivel) values(?,?)";
            ps =con.prepareStatement(sql);
            ps.setInt(1,nivel.getID_Nivel());            
            ps.setString(2, nivel.getDES_Nivel());
            ps.executeUpdate();
        }
         catch(SQLException e)
        {
            throw new Exception("Erro ao inserir Nivel \n"+e.getMessage());
        }
    }
    
     public void ExcluiNivel(Nivel nivel) throws Exception
     {
        PreparedStatement ps =null;

        if(nivel ==null)
        throw new Exception("Não pode excluir um NIVEL nulo");

        try
        {
            ps =con.prepareStatement("delete from NIVEL where ID_Nivel =?");
            ps.setInt(1,nivel.getID_Nivel());
            ps.executeUpdate();
        }
        catch(SQLException e)
        {
            throw new Exception("Erro ao excluir Nivel \n"+e.getMessage());
        }
    }

    public void AlteraNivel(Nivel nivel) throws Exception
    {
        PreparedStatement ps =null;

        if(nivel ==null)
            throw new Exception("Não pode alterar nivel nulo");
        try
        {
            String sql ="update nivel set DES_Nivel= ?";

            ps =con.prepareStatement(sql);
            ps.setString(1, nivel.getDES_Nivel());
            ps.executeUpdate();
        }
        catch(SQLException e)
        {
            throw new Exception("Erro ao alterar dados Nivel\n"+e.getMessage());
        }
    }
    
     public List ListaNivel() throws Exception
    {
        PreparedStatement ps =null;
        ResultSet rs =null;
        try
        {
            ps =con.prepareStatement("select * from nivel order by ID_Nivel asc");
            rs =ps.executeQuery();

            List<Nivel> list = new ArrayList<Nivel>();

            while(rs.next())
            {
                int ID_Nivel =rs.getInt(1);
                String DES_Nivel =rs.getString(2);

                Nivel nivel = new Nivel(ID_Nivel,DES_Nivel);
                list.add(nivel);
            }
            return list;
        }
        catch(SQLException e)
        {
            throw new Exception("Erro ao listar Níveis \n"+e.getMessage());
        }
    }
     
     public Nivel LocalizaNivel(int ID_Nivel) throws Exception
     {
        PreparedStatement ps =null;
        ResultSet rs = null;

        if(ID_Nivel == 0)
            throw new Exception("Não pode Localizar NIVEL de ID igual a 0");

        try
        {
            ps =con.prepareStatement("select * from NIVEL where ID_Nivel = ?");
            ps.setInt(1,ID_Nivel);
            rs =ps.executeQuery();
            

            if(!rs.next())
                throw new Exception("Não foi encontrado nenhum NIvel com o id "+ID_Nivel);

            String DES_Nivel = rs.getString(2);

             Nivel nivel = new  Nivel(ID_Nivel,DES_Nivel);
             return nivel;
        }
        catch(SQLException e)
        {
            throw new Exception("Erro ao localizar Nivel \n"+e.getMessage());
        }
    }
    
  
}
